/***********************************************************************************
 * 文件名： sg_ctrl.h
 * 版本： 1
 * 说明：
 * 		UI控制器，处理UI的切换、提供定时器。
 * 修改记录：
 * 	2024/01/10: 初版。 刘言。
***********************************************************************************/
#ifndef _SG_CTRL_H_
#define _SG_CTRL_H_

#include "sg_type.h"


/**
 * 初始化UI显示。
*/
void Sg_Init();

/**
 * 创建并切换到页面，会依次触发 UNLOADED LOADED 事件。
 * 注意：确保在页面创建函数中不要再次调用页面创建函数；避免调用之后任然还在操作之前页面的数据（可能需要添加return）。
 * @param creat_fun 期望切换到的页面创建函数。
 * @param param 页面创建函数的参数，通常用于上一个页面给下一个页面传递数据，作为页面的一个初始参数
*/
void SgPage_SwitchTo(sg_page_creat_fun_t creat_fun, void *param);


void SgPage_Clear();


/**
 * 通知事件到UI前台页面，通常通知一些用户自定义事件，比如收到一包数据
*/
void SgPage_NotifyEvent(sg_ev_code_t ev_code);

/**
 * 获取当前页面句柄
*/
sg_page_base_t *SgPage_GetNowPage();

/**
 * 清零页面对象的基类部分
 */
STATIC_FORCE_IN_LINE void SgPage_InitBase(void * page)
{
    memset(page, 0, sizeof(sg_page_base_t));
}

/**
 * 设置页面删除函数，在页面需要被删除时会被调用。如果不设置，将仅执行 free(page)。
*/
STATIC_FORCE_IN_LINE void SgPage_SetDeleteFun(void * page, sg_page_delete_fun_t delete_fun)
{
    ((sg_page_base_t *)page)->DeleteFun = delete_fun;
}

/**
 * 设置页面事件回调函数
 */
STATIC_FORCE_IN_LINE void SgPage_SetCb(void * page, sg_cb_t cb)
{
    ((sg_page_base_t *)page)->CallBack = cb;
}

/**
 * 设置定时器间隔。时间到后触发 SG_EV_TIMER_UPDATE 事件。每次设置将会清零定时器。页面删除后不会再通知事件。
 * @param interval 定时间隔，最大8190ms.
 */
void SgPage_SetTimerInterval(u16 interval);

#endif
